package com.zxt.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.zxt.mapper.EmpExprMapper;
import com.zxt.mapper.EmpMapper;
import com.zxt.pojo.*;
import com.zxt.service.EmpService;
import com.zxt.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;


import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@Service
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExprMapper empExprMapper;

//    @Override
//    public PageResult<Emp> page(Integer page, Integer pageSize) {
//
//        Integer start = (page - 1) * pageSize;
//        List<Emp> empList = empMapper.getEmpList(start, pageSize);
//        Long total = empMapper.total();
//        return new PageResult<Emp>(total, empList);
//    }


    @Override
    public PageResult<Emp> page(EmpQueryParam param) {
        //1设置分页参数固定的写法 参数里面传第几页和·每页展示的数量
        PageHelper.startPage(param.getPage(), param.getPageSize());


        List<Emp> empList = empMapper.getEmpList(param);

        Page<Emp> p = (Page<Emp>) empList;

        return new PageResult<>(p.getTotal(), p.getResult());
    }
                        //rollbackFor设置成.class意味着只要是异常就回滚，默认是遇到运行时异常回滚
    // propagation设置为REQUIRED，表示需要开启事务，如果当前没有事务，则创建一个事务，如果当前有事务，则加入到当前事务中
    //常常使用REQUIRES_NEW 表示会让之前的事务挂起 他自己开启一个新的事务
    @Transactional(rollbackFor =  {Exception.class},propagation =  Propagation.REQUIRED)//spring的事务控制，加在Service层的接口，类，方法上，推荐加在需要事务管理的方法上
    //加了之后意味着 在执行方法前将开启事务，如果运行过程出现异常则回滚，不会对数据库进行操作 若无异常则提交commit
    @Override
    public void add(Emp emp) {


        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.addEmp(emp);
        /*前端添加数据的时候并没有给id，添加这条emp数据之后 数据库id自增给一个id，
        但这个id不在emp这个对象中 需要在xml文件中加
        <insert id="addEmp" useGeneratedKeys="true" keyProperty="id">
        这样数据库自增生成的id会自动传给emp对象中的id
        */
        //获取刚刚添加的这条数据的id
        Integer id = emp.getId();
        //得到工作经历集合
        List<EmpExpr> exprList = emp.getExprList();
        //判断工作经历是否为空
        if (!CollectionUtils.isEmpty(exprList)) {
            //不为空 那就是把工作经历的empId设置成刚刚添加的这条数据的id
            //而且是循环把每一条的工作经历的id都设置为Integer id = emp.getId();
            exprList.forEach(empExpr -> empExpr.setEmpId(id));
            empExprMapper.addExpr(exprList);
        }
    }

    @Override
    public void delete(List<Integer> ids) {
        empMapper.deleteByIds(ids);
        empExprMapper.deleteByEmpIds(ids);
    }

    @Override
    public Emp getById(Integer id) {
        return  empMapper.getById(id);
    }
  @Transactional(rollbackFor =  {Exception.class})
    @Override
    public void update(Emp emp) {
        emp.setUpdateTime(LocalDateTime.now());
        //1.修改员工信息
          empMapper.update(emp);

        //2.修改员工工作经历
        //2.1删除员工原有工作经历
        empExprMapper.deleteByEmpIds(Arrays.asList(emp.getId()));
        //2.2添加员工新的工作经历
        List<EmpExpr> exprList = emp.getExprList();
        //如果exprList空 意思就是修改员工的时候没有修改工作经历 就不需要进一步操作
        if (!CollectionUtils.isEmpty(exprList)){
            //由于前端界面修改的时候没有添加empId的选项 所以需要自行添加 把emp对象的id传给exprList集合里每一条工作经历的empID
            for (EmpExpr expr : exprList) {
                expr.setEmpId(emp.getId());
            }
            empExprMapper.addExpr(exprList);
        }
    }

    @Override
    public LogInfo Login(Emp emp) {
        //1.调用mapper接口，根据用户名密码查询员工数据
           Emp e=empMapper.selectByUserameAndPassord(emp);
        //2.判断员工数据是否为空
           if(e!=null) {
               log.info("登录成功,员工信息：{}", e);

               Map<String, Object> claims=new HashMap<>();
               claims.put("id",e.getId());
               claims.put("username",e.getUsername());
               String jwt = JwtUtils.generateJwt(claims);
               return new LogInfo(e.getId(), e.getUsername(), e.getName(), jwt);
           }
        return null;
    }




}

//@Service
//public class EmpServiceImpl  implements EmpService {
//
//    @Autowired
//    private EmpMapper empMapper;
//    @Override
//    public PageResult<Emp> page(Integer page, Integer pageSize) {
//         //1设置分页参数
//        PageHelper.startPage(page,pageSize);
//        //2执行查询
//        List<Emp> empList = empMapper.getEmpList();
//        Page p= (Page<Emp>)empList;
//        //3获取分页结果
//        return new PageResult<>(p.getTotal(),p.getResult());
//    }
//
//
//}
